package com.unionftech.common.aspectj

import com.unionftech.common.utils.LogUtils
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Pointcut
import org.aspectj.lang.reflect.MethodSignature

/**
 *  Java写的业务逻辑，kotlin的aspect文件能够对其切入；
 *  Kotlin写的业务逻辑，Java的Aspect文件不能对其切入
 */
@Aspect //定义切面类
class ClickBehaviorAspect {
    //1.应用中用到哪些注解，放到当前切入点进行处理（找到需要处理的切入点）
    //execution,以方法执行时作为切点，触发Aspect类
    //* *(..)可以处理ClickBehavior这个类所有方法
    @Pointcut("execution(@com.unionftech.common.aspectj.ClickBehavior * *(..))")
    fun clickBehaviorPointCut() {
    }

    //2.切入点如何处理
    @Around("clickBehaviorPointCut()")
    @Throws(Throwable::class)
    fun joinPoint(joinPoint: ProceedingJoinPoint): Any? {
        //获取签名方法
        val methodSignature = joinPoint.signature as MethodSignature
        //获取方法所属的类名
        val className = methodSignature.declaringType.simpleName
        //获取方法名
        val methodName = methodSignature.name
        //获取方法的注解值(需要统计的用户行为)
        val funName = methodSignature.method.getAnnotation(ClickBehavior::class.java)?.value
        val begin = System.currentTimeMillis()
        LogUtils.d(TAG, "ClickBehavior Method start >>>")
        val result = joinPoint.proceed() //切面方法执行
        val duration = System.currentTimeMillis() - begin
        LogUtils.d(TAG, "ClickBehavior Method end >>>")
        LogUtils.d(
            TAG,
            String.format(
                "统计了: %s功能，在%s类的%s方法，用时%d ms",
                funName,
                className,
                methodName,
                duration
            )
        )
        return result
    }

    companion object {
        private val TAG = ClickBehaviorAspect::class.java.simpleName
    }
}